//-----------------------------------------------------------------------------
#include "gpio_driver.h"


volatile uint16_t pulse1 = 0;
volatile uint16_t pulse2 = 0;

volatile bool key1_pressed = false;
volatile bool key2_pressed = false;
volatile bool key3_pressed = false;
volatile bool key4_pressed = false;


void GPIO_TogglePin(uint32_t PORTx, uint32_t Pin)
{
    gpio_bit_write(PORTx, Pin, (bit_status)(1 - gpio_input_bit_get(PORTx, Pin)));
}
bool GPIO_ReadPin(uint32_t PORTx, uint32_t Pin)
{
    return (bool)gpio_input_bit_get(PORTx, Pin);
}

void EXTI0_IRQHandler(void)
{
  
    if (RESET != exti_interrupt_flag_get(EXTI_0))
    {
       //printf("AWAKE\n");
        key1_pressed = true;
        exti_interrupt_flag_clear(EXTI_0);
    }

}
void EXTI1_IRQHandler(void)
{
    if (RESET != exti_interrupt_flag_get(EXTI_1))
    {
        pulse1++;
        exti_interrupt_flag_clear(EXTI_1);
    }
}
void EXTI2_IRQHandler(void)
{
    if (RESET != exti_interrupt_flag_get(EXTI_2))
    {
        pulse2++;
        exti_interrupt_flag_clear(EXTI_2);
    }
}
void EXTI3_IRQHandler(void)
{
    if (RESET != exti_interrupt_flag_get(EXTI_3))
    {
       // printf("ENTER\n");
        key4_pressed = true;
        exti_interrupt_flag_clear(EXTI_3);
    }
}
void EXTI4_IRQHandler(void)
{
    if (RESET != exti_interrupt_flag_get(EXTI_4))
    {
        //printf("MODEL\n");
        key3_pressed = true;
        exti_interrupt_flag_clear(EXTI_4);
    }
}

/*!
    \brief      this function handles external lines 5 to 9 interrupt request
    \param[in]  none
    \param[out] none
    \retval     none
*/
void EXTI5_9_IRQHandler(void)
{
#if 1	
    // 对应pc8
    if (RESET != exti_interrupt_flag_get(KEY2_EXTI_LINE))
    {
        //printf("TEST\n");
        key2_pressed = true;
        exti_interrupt_flag_clear(KEY2_EXTI_LINE);
    }
    
#endif
}

void GPIO_Init()
{
    gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
    rcu_periph_clock_enable(RCU_AF);


    // PULSE1，脉冲输入1，输入模式，外部中断1
    rcu_periph_clock_enable(PULSE1_GPIO_CLK); 
    gpio_init(PULSE1_GPIO_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, PULSE1_PIN);
                                  
    gpio_exti_source_select(PULSE1_EXTI_PORT_SOURCE, PULSE1_EXTI_PIN_SOURCE);            
    exti_init(PULSE1_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING); 
    exti_interrupt_flag_clear(PULSE1_EXTI_LINE);
    

    // PULSE2，脉冲输入2，输入模式，外部中断2
    rcu_periph_clock_enable(PULSE2_GPIO_CLK);
    gpio_init(PULSE2_GPIO_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, PULSE2_PIN);
   
    gpio_exti_source_select(PULSE2_EXTI_PORT_SOURCE, PULSE2_EXTI_PIN_SOURCE);
    exti_init(PULSE2_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(PULSE2_EXTI_LINE);
  

    // PA1，电源电压分压输入，模拟量采集，浮空模式
    rcu_periph_clock_enable(POWER_ADC_RCU);
    gpio_init(POWER_ADC_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, POWER_ADC_PIN);
    GPIO_BC(POWER_ADC_PORT) = POWER_ADC_PIN;

    
    
    // C12V,控制54331使能，默认输出低
    rcu_periph_clock_enable(C12V_GPIO_CLK);
    gpio_init(C12V_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, C12V_PIN);
    gpio_bit_write(C12V_GPIO_PORT, C12V_PIN, RESET);
    

  

    // WAKEUP_KEY，唤醒按键，PA0，作为按键1和唤醒使用，输入浮空，由与非门给输入
    rcu_periph_clock_enable(WAKEUP_KEY_GPIO_CLK);
    gpio_init(WAKEUP_KEY_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, WAKEUP_KEY_PIN);

   // nvic_irq_enable(KEY1_EXTI_IRQn, 10U, 0U);
    gpio_exti_source_select(KEY1_EXTI_PORT_SOURCE, KEY1_EXTI_PIN_SOURCE);
    exti_init(KEY1_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(KEY1_EXTI_LINE);

    // KEY2，按键2，外部上拉，浮空输入模式
    rcu_periph_clock_enable(KEY2_GPIO_CLK);
    gpio_init(KEY2_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY2_PIN);
   // nvic_irq_enable(KEY2_EXTI_IRQn, 10U, 0U);
    gpio_exti_source_select(KEY2_EXTI_PORT_SOURCE, KEY2_EXTI_PIN_SOURCE);
    exti_init(KEY2_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(KEY2_EXTI_LINE);

    // KEY3，按键3，外部上拉，浮空输入模式
    rcu_periph_clock_enable(KEY3_GPIO_CLK);
    gpio_init(KEY3_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY3_PIN);
   // nvic_irq_enable(KEY3_EXTI_IRQn, 10U, 0U);
    gpio_exti_source_select(KEY3_EXTI_PORT_SOURCE, KEY3_EXTI_PIN_SOURCE);
    exti_init(KEY3_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(KEY3_EXTI_LINE);

    // KEY4，按键4，外部上拉，浮空输入模式
    rcu_periph_clock_enable(KEY4_GPIO_CLK);
    gpio_init(KEY4_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY4_PIN);
    //nvic_irq_enable(KEY4_EXTI_IRQn, 10U, 0U);
    gpio_exti_source_select(KEY4_EXTI_PORT_SOURCE, KEY4_EXTI_PIN_SOURCE);
    exti_init(KEY4_EXTI_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(KEY4_EXTI_LINE);

   
    // UART1，作为485和格雷码采集，对应PA2,PA3
    rcu_periph_clock_enable(UART1_RX_GPIO_CLK);
    rcu_periph_clock_enable(UART1_TX_GPIO_CLK);
    gpio_init(UART1_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, UART1_TX_PIN);      
    gpio_init(UART1_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART1_RX_PIN); 

    // PEN_INT,触摸屏中断，输入模式，PA4,暂时不配置


    // LCD_SCK，显示SPI接口，PA5,复用，LCD_MISO，显示SPI接口,PA6，复用LCD_MOSI，显示SPI接口,PA7，复用
    rcu_periph_clock_enable(LCD_SCK_GPIO_CLK);
    rcu_periph_clock_enable(LCD_MISO_GPIO_CLK);
    rcu_periph_clock_enable(LCD_MOSI_GPIO_CLK);
    gpio_init(LCD_MOSI_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, LCD_MOSI_PIN);          // LCD_MOSI
    gpio_init(LCD_MISO_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_MISO_PIN);     // LCD_MISO
    gpio_init(LCD_SCK_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, LCD_SCK_PIN);          // LCD_SCK   
    gpio_bit_write(LCD_SCK_GPIO_PORT, LCD_SCK_PIN, RESET);

    // LCD_RST，显示屏复位接口，默认输出高，低电平复位
    rcu_periph_clock_enable(LCD_RST_GPIO_CLK);
    gpio_init(LCD_RST_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_RST_PIN);  // LCD_RST
    gpio_bit_write(LCD_RST_GPIO_PORT, LCD_SCK_PIN, SET);
   

    // LCD_RS，显示屏数据指令，默认输出高
    rcu_periph_clock_enable(LCD_RS_GPIO_CLK);
    gpio_init(LCD_RS_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_RS_PIN);  // LCD_RS
    gpio_bit_write(LCD_RS_GPIO_PORT, LCD_SCK_PIN, SET);

    // LCD_CS 显示屏片选，默认输出高
    rcu_periph_clock_enable(LCD_CS_GPIO_CLK);
    gpio_init(LCD_CS_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_CS_PIN);  // LCD_CS
    gpio_bit_write(LCD_CS_GPIO_PORT, LCD_CS_PIN, SET);

    // PEN_CS 触摸屏片选，PB1,暂时不用


    // UART2，作为调试接口，PB10,PB11
    rcu_periph_clock_enable(UART2_RX_GPIO_CLK);
    rcu_periph_clock_enable(UART2_TX_GPIO_CLK);
    gpio_init(UART2_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, UART2_TX_PIN);       
    gpio_init(UART2_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART2_RX_PIN); 
    
    // SCREEN_EN，显示屏电源控制，默认输出低
    rcu_periph_clock_enable(SCREEN_EN_GPIO_CLK);
    gpio_init(SCREEN_EN_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SCREEN_EN_PIN);  
    gpio_bit_write(SCREEN_EN_GPIO_PORT, SCREEN_EN_PIN, RESET);

    // W25Q32_CLK,W25Q32_DO,W25Q32_DI，外部flash用spi接口，PB13,PB14,PB15，复用模式spi1
    rcu_periph_clock_enable(W25Q32_CLK_GPIO_CLK);
    rcu_periph_clock_enable(W25Q32_DO_GPIO_CLK);
    rcu_periph_clock_enable(W25Q32_DI_GPIO_CLK);
    gpio_init(W25Q32_CLK_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, W25Q32_CLK_PIN);
    gpio_init(W25Q32_DI_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, W25Q32_DI_PIN);
    gpio_init(W25Q32_DO_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, W25Q32_DO_PIN);

    // W25Q32_CS，外部flash片选，默认输出高
    rcu_periph_clock_enable(W25Q32_CS_GPIO_CLK);
    gpio_init(W25Q32_CS_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, W25Q32_CS_PIN);
    gpio_bit_write(W25Q32_CS_GPIO_PORT, W25Q32_CS_PIN, SET);
    
    // CLK595，595串行时钟，默认输出高
    rcu_periph_clock_enable(CLK595_GPIO_CLK);
    gpio_init(CLK595_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, CLK595_PIN);
    gpio_bit_write(CLK595_GPIO_PORT, CLK595_PIN, SET);
   
    // STR595,595锁存时钟，默认输出高
    rcu_periph_clock_enable(STR595_GPIO_CLK);
    gpio_init(STR595_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, STR595_PIN);
    gpio_bit_write(STR595_GPIO_PORT, STR595_PIN, SET);
    
    // DATA595，595串行数据，默认输出高
    rcu_periph_clock_enable(DATA595_GPIO_CLK);
    gpio_init(DATA595_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, DATA595_PIN);
    gpio_bit_write(DATA595_GPIO_PORT, DATA595_PIN, SET);


   
    // AN_DRDY，ADC芯片数据状态，输入模式，外部上拉
    rcu_periph_clock_enable(AN_DRDY_GPIO_CLK);
    gpio_init(AN_DRDY_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, AN_DRDY_PIN);
   
    // AN_DOUT，ADC芯片数据输出，输入模式，外部上拉
    rcu_periph_clock_enable(AN_DOUT_GPIO_CLK);
    gpio_init(AN_DOUT_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, AN_DOUT_PIN);

    // AN_CLK，ADC芯片通讯时钟，输出模式，外部上拉
    rcu_periph_clock_enable(AN_CLK_GPIO_CLK);
    gpio_init(AN_CLK_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, AN_CLK_PIN);
    gpio_bit_write(AN_CLK_GPIO_PORT, AN_CLK_PIN, SET);



    // AN_DIN，ADC芯片数据输入，输出模式，外部上拉
    rcu_periph_clock_enable(AN_DIN_GPIO_CLK);
    gpio_init(AN_DIN_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, AN_DIN_PIN);
    gpio_bit_write(AN_DIN_GPIO_PORT, AN_CLK_PIN, SET);



    // C_12VEC20，控制网关电源，默认输出低，给网关电源复位用
    rcu_periph_clock_enable(C_12VEC20_GPIO_CLK);
    gpio_init(C_12VEC20_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, C_12VEC20_PIN);
    gpio_bit_write(C_12VEC20_GPIO_PORT, C_12VEC20_PIN, RESET);

    // GSM_ON_OFF 4G模块电源控制，默认输出低
    rcu_periph_clock_enable(GSM_ON_OFF_GPIO_CLK);
    gpio_init(GSM_ON_OFF_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GSM_ON_OFF_PIN);
    gpio_bit_write(GSM_ON_OFF_GPIO_PORT, GSM_ON_OFF_PIN, RESET);

    // UART3，网关使用,PC10,PC11,默认19200
    rcu_periph_clock_enable(UART3_RX_GPIO_CLK);
    rcu_periph_clock_enable(UART3_TX_GPIO_CLK);
    gpio_init(UART3_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, UART3_TX_PIN);
    gpio_init(UART3_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART3_RX_PIN);


    // UART4，4g使用，PC12,PD2,默认波特率115200
    rcu_periph_clock_enable(UART4_RX_GPIO_CLK);
    rcu_periph_clock_enable(UART4_TX_GPIO_CLK);
    gpio_init(UART4_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, UART4_TX_PIN);
    gpio_init(UART4_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART4_RX_PIN);

    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_init(GPIOA, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, GPIO_PIN_0);

   


    // UART0，PB6，PB7，北斗使用，默认9600
    rcu_periph_clock_enable(UART0_TX_GPIO_CLK);
    rcu_periph_clock_enable(UART0_RX_GPIO_CLK);
    gpio_init(UART0_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, UART0_TX_PIN);
    gpio_init(UART0_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART0_RX_PIN);

  

    // STM_PWRKEY,4g模块上电时序按键，PB9,默认输出低
    rcu_periph_clock_enable(STM_PWRKEY_GPIO_CLK);
    gpio_init(STM_PWRKEY_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, STM_PWRKEY_PIN);
    gpio_bit_write(STM_PWRKEY_GPIO_PORT, STM_PWRKEY_PIN, RESET);
}

bool read_key1_level(void)
{
    bool ret = false;
    if (key1_pressed)
    {
        ret = true;
        key1_pressed = false;
    }
    return ret;
}
bool read_key2_level(void)
{
    bool ret = false;
    if (key2_pressed)
    {
        ret = true;
        key2_pressed = false;
    }
    return ret;
}
bool read_key3_level(void)
{
    bool ret = false;
    if (key3_pressed)
    {
        ret = true;
        key3_pressed = false;
    }
    return ret;
}
bool read_key4_level(void)
{
    bool ret = false;
    if (key4_pressed)
    {
        ret = true;
        key4_pressed = false;
    }
    return ret;
}

void gpio_sleep_mode(void)
{
    // 浮空外部flash片选脚
    rcu_periph_clock_enable(W25Q32_CS_GPIO_CLK);
    gpio_init(W25Q32_CS_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, W25Q32_CS_PIN);
  

    rcu_periph_clock_enable(W25Q32_CLK_GPIO_CLK);
    rcu_periph_clock_enable(W25Q32_DO_GPIO_CLK);
    rcu_periph_clock_enable(W25Q32_DI_GPIO_CLK);
    gpio_init(W25Q32_CLK_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, W25Q32_CLK_PIN);
    gpio_init(W25Q32_DI_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, W25Q32_DI_PIN);
    gpio_init(W25Q32_DO_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, W25Q32_DO_PIN);


    gpio_init(STM_PWRKEY_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, STM_PWRKEY_PIN);
    gpio_init(UART4_TX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART4_TX_PIN);
    gpio_init(UART3_TX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART3_TX_PIN);
    gpio_init(GSM_ON_OFF_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GSM_ON_OFF_PIN);

    gpio_init(AN_CLK_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, AN_CLK_PIN);
    gpio_init(AN_DIN_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, AN_DIN_PIN);

    gpio_init(DATA595_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, DATA595_PIN);
    gpio_init(STR595_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, STR595_PIN);
    gpio_init(CLK595_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, CLK595_PIN);
    gpio_init(LCD_RST_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_RST_PIN);        // LCD_RST
    gpio_init(LCD_CS_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_CS_PIN);        // LCD_RST
    gpio_init(SCREEN_EN_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, SCREEN_EN_PIN);
    gpio_init(LCD_RS_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_RS_PIN);          // LCD_RS
    gpio_init(LCD_MOSI_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_MOSI_PIN);     // LCD_MOSI
    gpio_init(LCD_MISO_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_MISO_PIN);     // LCD_MISO
    gpio_init(LCD_SCK_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, LCD_SCK_PIN); 
    gpio_init(UART1_TX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, UART1_TX_PIN);

  
}

void gsm_on(void)
{
    GSM_ON;
}

void gsm_off(void)
{	
    GSM_OFF;
}

void gsm_pwr_key_h(void)
{
    GSM_PWR_KEY_H;
}
void gsm_pwr_key_l(void)
{
    GSM_PWR_KEY_L;
}


void netway_pwr_key_h(void)
{
    ;
}
void netway_pwr_key_l(void)
{
    ;
}